﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//1.不能创建临时变量（第三个变量），实现两个整数的交换。
//法一：
//思想：利用异或运算的特殊性质
//a ^ 0 = a ; a ^ a = 0
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("变换前，a = %d\n", a);
//	printf("变换前，b = %d\n", b);
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("变换后，a = %d\n", a);
//	printf("变换后，b = %d\n", b);
//	return 0;
//}

//法二
//利用相加原理
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("变换前，a = %d\n", a);
//	printf("变换前，b = %d\n", b);
//	a = a + b;
//	b = a - b;
//	a = a - b;
//	printf("变换后，a = %d\n", a);
//	printf("变换后，b = %d\n", b);
//	return 0;
//}


//2.编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数。
//法一：参考10进制依次打印最后一位数
//但是有一个缺陷：只可以针对正数
//int Calculate(int x)
//{
//	int count = 0;
//	while (x)
//	{
//		if (x % 2 == 1)
//		{
//			count++;
//		}
//		x = x / 2;
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int r = Calculate(n);
//	printf("%d", r);
//	return 0;
//}

//法二：解决上面的缺陷
//int Calculate(unsigned int x)
//{
//	int count = 0;
//	while (x)
//	{
//		if (x % 2 == 1)
//		{
//			count++;
//		}
//		x = x / 2;
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int r = Calculate(n);
//	printf("%d", r);
//	return 0;
//}

法三：利用按位与和移位操作符
//int Calculate(int x)
//{
//	int count = 0;
//	for (int i = 0; i < 32; i++)
//	{
//		if ((1 & (x >> i)) == 1)
//		{
//			count++;
//		}
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int r = Calculate(n);
//	printf("%d", r);
//	return 0;
//}

int Calculate(int x)
{
	int count = 0;
	while (x)
	{
		count++;
		x = x & (x - 1);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int r = Calculate(n);
	printf("%d", r);
	return 0;
}